#ifndef __PRODUCTO_H__
#define __PRODUCTO_H__
#include "Tipos.h"
#include "PresentacionPrecio.h"

using namespace std;

typedef map<int,CPresentacionPrecio>			MapPresPrecio;
typedef map<int,CPresentacionPrecio>::iterator	itMapPresPrecio;
class CProducto
{
	string		m_codProd;
	string		m_marca;
	string		m_nombre;
	TIPO_DATO	m_cantPres;
	string		m_presentacion;
	string		m_precio;
	string 		m_registro; //tengo el registro armado y cargado
	MapPresPrecio	m_lista;
	
public:
	CProducto(void){m_cantPres=0;};
	~CProducto(void){};
	string getCodProd(){return m_codProd;}
	string getMarca(){return m_marca;}
	string getNombre(){return m_nombre;}
	string getRegCantPres(){return convertirChar(m_cantPres,TAMANIO_BYTE_DIN);}
	string getPresentacion(){return m_presentacion;}
	string getPrecio(){return m_precio;}
	string getClaveCandidata();
	string getLista();
	int getTamanioLista();
	void mostrarLista(ostream &archSalida);
	void mostrar(ostream &archSalida);
	void setProducto(string registro);
	
	/*ariel */
	string getRegistro(){return m_registro;}
	/*con estos metodos set voy a ir armando el registro para despues pasarlo en el menu*/
	/* cuando uso estos metodos se tienen que usar en orden para que se carguen los datos al registro*/
	/*si se quiere ingresar de forma desordenada hay que mejorar los metodos*/
	void setRegCodProd(string);
	void setRegMarca(string);
	void setRegNombre(string);
	void setRegPresentacion(string);		
	void setRegPrecio(string);			
	void setRegPrecio(int indice,string precio);
	void setRegCantPres(string cantidad);
	void setRegCantPres(int cantidad);
	void eliminarPresentacion(int indice);
	/*	fin ariel*/
};
/*-----------------------------------------------------------*/
string CProducto::getClaveCandidata()
{
	return this->m_codProd +convertirChar((TIPO_DATO)m_marca.length(),TAMANIO_BYTE_DIN) +this->m_marca +convertirChar((TIPO_DATO)m_nombre.length(),TAMANIO_BYTE_DIN) +this->m_nombre;
}
/*-----------------------------------------------------------*/
void CProducto::setProducto(string registro)
{
	string revision;
	int tamanio=0,posicion=0;
	//CODIGO DE PRODUCTO
	m_codProd = registro.substr(posicion,5); 
	posicion+=5;
	//MARCA
	revision = registro.substr(posicion+1,TAMANIO_BYTE_DIN);
	revision = registro.substr(posicion,TAMANIO_BYTE_DIN);
	tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));
	posicion+=TAMANIO_BYTE_DIN;
	m_marca = registro.substr(posicion,tamanio);
	posicion+=tamanio;
	//NOMBRE
	tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));
	posicion+=TAMANIO_BYTE_DIN;
	m_nombre = registro.substr(posicion,tamanio);
	posicion+=tamanio;
	//cantidad de presentaciones
	m_cantPres=string2TipoDato((registro.substr(posicion,TAMANIO_BYTE_DIN)));
	posicion+=TAMANIO_BYTE_DIN;
	for(unsigned int i=0;i<m_cantPres;i++)
	{
		CPresentacionPrecio presPrecio;
		//PRESENTACION
		tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_PRES));
		posicion+=TAMANIO_BYTE_PRES;
		m_presentacion = registro.substr(posicion,tamanio);
		presPrecio.setPresentacion(m_presentacion);
		posicion+=tamanio;
		//PRECIO
		tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));
		posicion+=TAMANIO_BYTE_DIN;
		m_precio = registro.substr(posicion,tamanio);
		posicion+= tamanio;
		presPrecio.setPrecio(m_precio);
		m_lista[i]=presPrecio;
	}
}

void CProducto::setRegCodProd(string codigo)
{
	m_codProd = codigo;//esto seria si por alguna razon necesito el codigo aslado del registro
	m_registro = codigo;//es lo primero que entra en el registro.	
}
void CProducto::setRegMarca(string marca)
{
	m_marca = marca;
	m_registro += convertirChar((int)marca.length(),TAMANIO_BYTE_DIN);
	m_registro += marca;
}
void CProducto::setRegNombre(string nombre)
{
	m_nombre = nombre;
	m_registro += convertirChar((int)nombre.length(),TAMANIO_BYTE_DIN);
	m_registro += nombre;	
}
void CProducto::setRegCantPres(int cantidad)
{
	m_cantPres = (TIPO_DATO)cantidad;  	
  	m_registro += convertirChar((TIPO_DATO)cantidad,TAMANIO_BYTE_DIN);
  	
	/*m_cantPres = convertirChar((TIPO_DATO)cantidad,TAMANIO_BYTE_DIN);
	m_cantPres = (TIPO_DATO)cantidad;
	m_registro+= itoa((int)m_cantPres);
	*/	
}
void CProducto::setRegCantPres(string cantidad)
{
	m_cantPres=atoi(cantidad.c_str());
	m_registro+= convertirChar(m_cantPres,TAMANIO_BYTE_DIN);
}

void CProducto::setRegPresentacion(string presentacion)
{
	m_presentacion =presentacion;
	m_registro += convertirChar((int)presentacion.length(),TAMANIO_BYTE_PRES);
	m_registro += presentacion;		
}
void CProducto::setRegPrecio(string precio)
{
	CPresentacionPrecio presPrecio;
	m_precio = precio;
	m_registro += convertirChar((int)precio.length(),TAMANIO_BYTE_DIN);
	m_registro += precio;	
	
	presPrecio.setPrecio(m_precio);
	presPrecio.setPresentacion(m_presentacion);
	m_lista[m_cantPres++]=presPrecio;    
}

string CProducto::getLista()
{
	string lista="";
	itMapPresPrecio it;
	for(it=m_lista.begin();it!=m_lista.end();it++)
		lista+=((*it).second).getPresentacion();
	return lista;
}

void CProducto::mostrarLista(ostream &archSalida) /* = std::cout*/
{
	itMapPresPrecio it;
	if(m_lista.size()>1)
		archSalida<<"Lista de Presentaciones y precios."<<endl<<endl;
	for(it=m_lista.begin();it!=m_lista.end();it++)
	{
		archSalida<<"Presentacion "<<(*it).first+1<<" : ";
		archSalida<<(*it).second.getPresentacion()<<endl;
		archSalida<<"Precio "<<(*it).first+1<<" : ";
		archSalida<<(*it).second.getPrecio()<<endl<<endl;
	}
}

void CProducto::mostrar(ostream &archSalida) /* = std::cout*/
{
	archSalida<<"Codigo de Producto : "<<this->getCodProd()<<endl;
	archSalida<<"Marca : "<<this->getMarca()<<endl;
	archSalida<<"Nombre : "<<this->getNombre()<<endl;
	this->mostrarLista(archSalida);
	
	/*TODO lo que sigue se puede borrar, es para chequear*/
	/*std::cout<<"Codigo de Producto : "<<this->getCodProd()<<endl;
	std::cout<<"Marca : "<<this->getMarca()<<endl;
	std::cout<<"Nombre : "<<this->getNombre()<<endl;
	this->mostrarLista(std::cout);
	*/
}

int CProducto::getTamanioLista()
{
	return (int)m_lista.size();
}
void CProducto::eliminarPresentacion(int indice)
{
	itMapPresPrecio it;
	it = m_lista.find(indice);
	if(it!=m_lista.end())
		m_lista.erase(it);
	else
		cout<<"No se puede borrar la presentacion"<<endl;
}
void CProducto::setRegPrecio(int indice,string precio)
{
	string presentacion;
	CPresentacionPrecio presAux;
	presAux = m_lista[indice];
	presAux.setPrecio(precio);
	m_lista[indice]=presAux;	
}
#endif //__PRODUCTO_H__
